Support XENFEAT_supervisor_mode_kernel in x86/64 HYPERVISOR_IRET macro
authorIan.Campbell@xensource.com <Ian.Campbell@xensource.com>
Mon, 27 Feb 2006 10:58:17 +0000 (10:58 +0000)
committerIan.Campbell@xensource.com <Ian.Campbell@xensource.com>
Mon, 27 Feb 2006 10:58:17 +0000 (10:58 +0000)
Signed-off-by: Ian Campbell <ian.campbell@xensource.com>
linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S

index 6a8e1c0a9f49b56519e65c8692e73e71a1419049..b2bcfb47e67e38430b48e38e0a03b89306bdb3f1 100644 (file)
@@ -51,6 +51,7 @@
 #include <asm/page.h>
 #include <asm/errno.h>
 #include <xen/interface/arch-x86_64.h>
+#include <xen/interface/features.h>
 
 #include "irq_vectors.h"
 
@@ -146,16 +147,19 @@ NMI_MASK = 0x80000000
          */
        .macro HYPERVISOR_IRET flag
        testb $3,1*8(%rsp)
-       jnz   1f
+       jnz   2f
        testl $NMI_MASK,2*8(%rsp)
+       jnz   2f
+
+       testb $1,(xen_features+XENFEAT_supervisor_mode_kernel)
        jnz   1f
 
        /* Direct iret to kernel space. Correct CS and SS. */
        orb   $3,1*8(%rsp)
        orb   $3,4*8(%rsp)
-       iretq
+1:     iretq
 
-1:     /* Slow iret via hypervisor. */
+2:     /* Slow iret via hypervisor. */
        andl  $~NMI_MASK, 16(%rsp)
        pushq $\flag
        jmp  hypercall_page + (__HYPERVISOR_iret * 32)